package cn.xin.system.service.impl;

import cn.xin.base.query.BaseQuery;
import cn.xin.base.util.PageList;
import cn.xin.system.domain.Menu;
import cn.xin.system.domain.Role;
import cn.xin.system.mapper.MenuMapper;
import cn.xin.system.mapper.RoleMapper;
import cn.xin.system.service.IMenuService;
import cn.xin.base.service.impl.BaseServiceImpl;
import cn.xin.system.vo.RoleAndMenuVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xin
 * @since 2023-01-03
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {

    @Autowired
    private RoleMapper roleMapper;

    /**
     * 查询一级列表
     * @return
     */
    @Override
    public List<Menu> first() {

        return super.findAll().stream().filter(menu ->null == menu.getParentId()).collect(Collectors.toList());
    }

    /**
     * 无限级数
     * @return
     */
    @Override
    public List<Menu> tree() {

        //查询出Menu所有的信息
        List<Menu> all = super.findAll();
        //对menu就行分组
        Map<Long, Menu> menuMap = all.stream().collect(Collectors.toMap(Menu::getId, menu -> menu));

        List<Menu> list = new ArrayList<>();

        all.forEach(menu -> {
            if (menu.getParentId() == null){
                //如果当前的parent_id为空就说明它是最上级的
                list.add(menu);
            }else {
                //如果当前的parent_id不为空，那它上面就还有
                Menu men = menuMap.get(menu.getParentId());
                if (men != null){
                    men.getChildren().add(menu);
                }
            }
        });
        return list;
    }

//    @Override
//    public PageList<Menu> queryByPage(BaseQuery query) {
//
//        //获取Menu的集合
//        PageList<Menu> menuPageList = super.queryByPage(query);
//        //判断menuPageList是否有数据
//        if (menuPageList == null || CollectionUtils.isEmpty(menuPageList.getRows())){
//            return menuPageList;
//        }
//
//        //获取menu的当前页的数据
//        List<Menu> menuList = menuPageList.getRows();
//        //通过当前页获取role的id集合
//        List<Long> menuIdList = menuList.stream().map(Menu::getId).collect(Collectors.toList());
//
//        //通过中间表的roleid获取到menuid的集合
//        List<RoleAndMenuVo> roleAndMenuVos = roleMapper.findByRoleIdList(menuIdList);
//        //对中间表就行分组 key为role的id，value为menu的id
//        Map<Long,List<Long>> listMap = roleAndMenuVos.stream().collect(Collectors.groupingBy(RoleAndMenuVo::getMenuId,Collectors.mapping(RoleAndMenuVo::getRoleId,Collectors.toList())));
//
//        menuList.forEach(menu -> {
//            List<Long> roleList = listMap.get(menu.getId());
//            menu.setRoles(roleList);
//
//        });
//        return menuPageList;
//    }
}
